// 具体实现在service层
import {injectable, inject} from 'inversify'
import { PrismaDB } from '../db'

import { plainToClass } from 'class-transformer'
import {validate} from'class-validator'
import { UserDto } from './user.dto'

import { JWT } from '../jwt'

@injectable()       // 注射器，相当于让这个类在容器中注册，可以让这个service在controller中注入
export class UserService {

    constructor(
        @inject(PrismaDB) private readonly prismaDB:PrismaDB,
        @inject(JWT) private readonly jwt:JWT                  // 再注入一个
    ){}

    public async getList() {  // 异步
        return await this.prismaDB.prisma.user.findMany()
    }

    // public async insertUser(user:any) {  // 类型在 prisma中
    //     return await this.prismaDB.prisma.user.create({
    //         data: user
    //     })
    // }
    // 使用dto改造
    public async insertUser(user: UserDto) {  // 类型在 prisma中
        let userDto = plainToClass(UserDto, user)          // plainToClass将参数合并到这个类里
        const errors = await validate(userDto)  // 使用 validate方法 验证
        console.log(errors);
        if(errors.length) {
            // 有错误，抛出异常
            return errors
        } else {
            const result = await this.prismaDB.prisma.user.create({
                data: user
            })
            return {
                ...result,
                token: this.jwt.createToken(result)    // 假设这是登录，成功后就返回一个token
            }
        }
    }
}